//
// Created by Toosan on 2022/4/29.
//

#include "iostream"

#include "string.h"

#include "set"

using namespace std;

class Person {
private:
    int age = 0;
    string name;

public:
    Person() {}

    Person(string name, int age) : name(name), age(age) {}

    void setAge(int age) {
        this->age = age;
    }

    int getAge() const {
        return this->age;
    }

    void setName(string name) {
        this->name = name;
    }

    string getName() const {
        return this->name;
    }

    void printInfo() {
        cout << "Person name = " << name << ", age = " << age << endl;
    }
};

//bool personCompare(const Person &person1, const Person &person2) {
//    return person1.getAge() < person2.getAge();
//}

// 自定义一个比较方式
typedef struct {
    /**
     * 重新定义set的谓词  以age大小排序
     * 重写谓词固定写法，写完之后，放到一个结构体中，丢给set就可以替换掉默认的谓词了
     * operator() (对象1，对象2) { 自定义实现比较方式}
     * @param person1
     * @param person2
     */
    bool operator()(const Person &person1, const Person &person2) {
        return person1.getAge() < person2.getAge();
    }
} Compare;

void printSetInfo(set<Person, Compare> setPerson) {
//    for (auto it = setPerson.begin(); it != setPerson.end(); it++) {
//        ((Person) *it).printInfo();
//    }
    for (const auto & it : setPerson) {
        ((Person) it).printInfo();
    }
}

/**
 * 谓词学习
 * 对象排序，指定排序方式
 * @return
 */
int main() {
    set<Person, Compare> setPerson;
    Person person1("Toosan", 26);
    Person person2("Jany", 24);
    Person person3("Bob", 28);
    setPerson.insert(person1);
    setPerson.insert(person2);
    setPerson.insert(person3);
    printSetInfo(setPerson);
    return 0;
}